<?php

namespace app\common\services;

use app\common\services\RSAAESDecrypter;
use app\common\services\DecryptException;
use think\facade\Env;

class Password
{
    /**
     * @var string
     */
    protected static $publickey = null;

    /**
     * @var RSAAESDecrypter
     */
    protected static $decrypter = null;

    /**
     * 获取默认公钥
     *
     * @return string 公钥
     */
    public static function getPublickey()
    {
        if (self::$publickey === null) {
            // 读取公钥
            $runtimePath = Env::get('runtime_path');
            $publickeyPath = $runtimePath . 'keys/public';
            self::$publickey = file_get_contents($publickeyPath);
        }

        return self::$publickey;
    }

    /**
     * 通过RSA-AES组合算法，使用enkey和iv解密password为原始密码，私钥使用默认，错误时直接返回响应
     *
     * @param string $enkey    加密后的key
     * @param string $iv       随机初始化向量
     * @param string $password 加密后的密码
     *
     * @return string 解密后的value
     */
    public static function decrypetPassword($enkey, $iv, $password)
    {
        if (self::$decrypter === null) {
            // 私钥路径，私钥保密不公开
            $runtimePath = Env::get('runtime_path');
            $privatekeyPath = $runtimePath . 'keys/private';
            try {
                self::$decrypter = new RSAAESDecrypter($privatekeyPath);
            } catch (DecryptException $e) {
                error('服务器异常：私钥未配置，请联系管理员');
            }
        }

        // 解密获取原始value
        try {
            $value = self::$decrypter->decrypet($enkey, $iv, $password);
        } catch (DecryptException $e) {
            error('服务器异常：无法识别的密码，请重试');
        }

        return $value;
    }
}
